"""
闭包：
    概述：
        使用了外部函数变量的内部函数，称之为闭包。

    回顾：局部变量的生命周期？
        局部变量随着函数的调用而存在，随着函数的调用完毕而销毁，即：函数执行结束后，变量就被释放了。

    格式：
        def 外部函数名(形参列表):
            可以在这里定义 外部函数的 局部变量

            def 内部函数名(形参列表):
                在这里使用 外部函数的变量

            return 内部函数名

    闭包的三个前提条件：
        1：有嵌套，即：有外部函数，有内部函数。
        2：有引用，即：在内部函数中，有使用外部函数的引用。
        3：有返回，即：在外部函数中，返回内部函数（对象）
"""
# 需求1：回顾局部变量的作用域。
def method():
    number = 10
    return number

# 需求2：演示闭包，定义用于求和的闭包函数，外部函数有参数num1，内部函数有参数num2，内部函数返回num1+num2
def outer(num1):                        # 定义了外部函数outer
    def inner(num2):                    # 定义了内部函数inner
        sum = num1+num2                 # 使用了外部函数的变量num1
        print(f"求和的结果是：{sum}")

    return inner                        # 外部函数返回内部函数对象

if __name__ == '__main__':
    # 目前：函数每次调用都会生成一个新的number变量，函数调用结束后，number变量就会销毁。
    print(method())  # 10
    print(method()+1) # 11
    print(method()+1) # 11
    print(method()+1) # 11

    print(20* "-")
    """
        fn = outer(10) # fn是外部函数outer的返回值，即内部函数inner
        fn = def inner(num2):                       # 定义了内部函数inner
                sum = 10 + num2                     # 使用了外部函数的变量num1
                print(f"求和的结果是：{sum}")
    """
    fn = outer(10) # fn是外部函数outer的返回值，即内部函数inner
    """
        fn(1)
        inner(1):                            # 定义了内部函数inner
                sum = 10 + 1                 # 使用了外部函数的变量num1
                print(f"求和的结果是：{sum}")
    """
    fn(1)
    """
        fn(2)
        inner(2):                            # 定义了内部函数inner
                sum = 10 + 2                 # 使用了外部函数的变量num1
                print(f"求和的结果是：{sum}")
    """
    fn(2)


"""
def outer(num1):                        # 定义了外部函数outer
    def inner(num2):                    # 定义了内部函数inner
        sum = num1+num2                 # 使用了外部函数的变量num1
        print(f"求和的结果是：{sum}")

    return inner                        # 外部函数返回内部函数对象

fun_outer = outer(100) # 初始化外部函数（结婚）
等同于
fun_outer = def inner(num2):                    # 定义了内部函数inner
        sum = 100+num2                 # 使用了外部函数的变量num1
        print(f"求和的结果是：{sum}")
        
fun_outer(1)    # 触发了函数执行（生孩子）
等同于= inner(1)
    sum = 100+1                 # 使用了外部函数的变量num1
    print("求和的结果是：", 101)

结果：求和的结果是：101

fun_outer(2)    # 触发了函数执行（生孩子）
等同于= inner(2)
    sum = 100+2                 # 使用了外部函数的变量num1
    print("求和的结果是：", 102)

结果：求和的结果是：102













"""